package top.dotgo.kit;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;

/**
 * 位置坐标 工具类
 *
 * @author jornlin
 * @date 2020/4/30 11:40 星期四
 */
public class LocationKit {

    private static double EARTH_RADIUS = 6378.137;

    private static double rad(double d) {
        return d * Math.PI / 180.0;
    }

    /**
     * 通过经纬度获取距离(单位：米)
     *
     * @param sLat 源纬度
     * @param sLng 源经度
     * @param tLat 目标纬度
     * @param tLng 目标经度
     * @return 距离
     */
    public static int getDistance(double sLat, double sLng, double tLat, double tLng) {
        double radLat1 = rad(sLat);
        double radLat2 = rad(tLat);
        double a = radLat1 - radLat2;
        double b = rad(sLng) - rad(tLng);
        double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2)
                + Math.cos(radLat1) * Math.cos(radLat2)
                * Math.pow(Math.sin(b / 2), 2)));
        s = s * EARTH_RADIUS;
        s = Math.round(s * 10000d) / 10000d;
        s = s * 1000;
        return (int) s;
    }

    /**
     * 获取纬度 偏移量
     * <p>
     * 在经线上，相差一纬度约为111km    ，因此100m（0.1KM）在经线上对应约为0.1/111=0.0009度
     *
     * @param distance 偏移 x米
     * @return 偏移量
     */
    public static double getLatDistance(int distance) {
        return NumberUtil.div(NumberUtil.div(distance, 178), 111);
    }

    /**
     * 获取经度 偏移量
     * <p>
     * 在纬线上，相差一经度约为111cosα（α为该纬线的纬度）因此100m（0.1KM）在该纬线上对应约为0.1/(111*cos23.14)=0.0009797度
     *
     * @param distance 偏移 x米
     * @return 偏移量
     */
    public static double getLonDistance(int distance, double lat) {
        double km = NumberUtil.div(distance, 1000);
        double a = NumberUtil.mul(178, Math.cos(lat));
        return NumberUtil.div(km, a);

    }

    public static void main(String[] args) {
        double lat = 39.930726;
        double lon = 116.638339;

        double a = getLatDistance(500);
        double b = getLonDistance(500, lat);

        System.err.println(StrUtil.format("p1={},{}", lon - a, lat - b));
        System.err.println(StrUtil.format("p2={},{}", lon + a, lat - b));
        System.err.println(StrUtil.format("p3={},{}", lon + a, lat + b));
        System.err.println(StrUtil.format("p4={},{}", lon - a, lat + b));

        System.err.println("p1距离：" + getDistance(lat, lon, lat - b, lon - a));
        System.err.println("p2距离：" + getDistance(lat, lon, lat - b, lon + a));
        System.err.println("p3距离：" + getDistance(lat, lon, lat + b, lon + a));
        System.err.println("p4距离：" + getDistance(lat, lon, lat + b, lon - a));

    }


}
